package LeetCode.String;

/**
 * 字符串循环移位
 * s = "abcd123" k = 3
 * Return "123abcd"
 * <p>
 * 思路：将 abcd123 中的 abcd 和 123 单独翻转，得到 dcba321，
 * 然后对整个字符串进行翻转，得到 123abcd。
 */
public class Test2 {
    //字符串截取：substring()
    //1. public String substring(int beginIndex)
    //2. public String substring(int beginIndex, int endIndex)
    //参数
    //beginIndex -- 起始索引（包括）, 索引从 0 开始。
    //endIndex -- 结束索引（不包括）。

    //字符串反转 https://www.cnblogs.com/binye-typing/p/9260994.html
    //1. 利用 StringBuffer 或 StringBuilder 的 reverse 成员方法:
    //2. 利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组，然后将各个字符进行重新拼接:
    //3. 利用 String 的 CharAt 方法取出字符串中的各个字符:
    private static String moveStr(String str, int k) {
        if (k < 0) {
            return "移动长度<0";
        }
        k = k % str.length();//考虑k大于源字符串长度的情况 比如原长度为5，那么循环右移动6位和1位是一样的
        //sb1为移位后在后面那一段的字符串 sb2为移到前面的字符串
        //String转StringBuilder,为了使用reverse函数(反转字符串)
        StringBuilder sb1 = new StringBuilder(str.substring(0, str.length()-k));
        StringBuilder sb2 = new StringBuilder(str.substring(str.length()-k));
        //反转字符串 :使用StringBuilder的reverse函数
        sb1.reverse();
        sb2.reverse();
        //拼接后再反转
        sb1.append(sb2);
        sb1.reverse();
        return sb1.toString();
    }

    public static void main(String[] args) {
        System.out.println("移动长度小于0：abcd123 -1 " + moveStr("abcd123", -1));
        System.out.println("移动长度小于字符串长度且大于0：abcd123 3 " + moveStr("abcd123", 3));
        System.out.println("移动长度大于字符串长度：abcd123 9 " + moveStr("abcd123", 9));

    }
}
